from django.shortcuts import render

# Create your views here.

# version_10 add表单

from polls.models import Post
from django.shortcuts import get_object_or_404 ,redirect,render
from django.views.decorators.http import require_POST

from .forms import CommentForm
from django.contrib import messages


@require_POST
def comment(request,post_pk):
    # 先获取被评论的文章，因为后面需要把评论和被评论的文章关联起来
    # get_object_or_404 函数的作用是如果存在则获取，不存在就返回404到页面给客户
    post = get_object_or_404(Post,pk=post_pk)

    # django将用户提交的数据封装在request.POST中
    # 利用这些数据构造了CommentForm的实例，这样就生成了一个绑定了用户提交数据的表单
    form = CommentForm(request.POST)
    

    # 当调用form.is_valid()方法时，django会自动帮我们检查表单的数据是否符合格式要求
    if form.is_valid():
        # 检查到数据是合法的，调用表单save方法保存数据到数据库
        # commit = False 的作用是仅仅利用表单的数据生成Comment模型类的实例，但还不保存评论数据到数据库
        comment = form.save(commit=False)


        # 将评论和被评论的文章关联
        comment.post = post

        # 最终将评论数据保存在数据库中
        comment.save()
        
        # 发送评论消息
        messages.add_message(request,messages.SUCCESS,'评论发表成功！',extra_tags='success')

        # 重定向到post的详情页，实际上当redirect函数接收一个模型的实例时，它会调用这个模型实例的 get_absolute_url 方法，然后重定向到 get_absolute_url 方法返回的 URL。
        return redirect(post)


    # 检查到数据不合法，我们渲染一个预览页面，用于展示表单的错误。
    # 注意这里被评论的文章 post 也传给了模板，因为我们需要根据 post 来生成表单的提交地址。
    context = {
        'post': post,
        'form': form,
    }
    
    messages.add_message(request,messages.ERROR,'评论发表失败！请修改表单中的错误后重新提交！',extra_tags='danger')
    return render(request, 'comments/preview.html', context=context)
